package futbolfacil.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import futbolfacil.excepcion.DAOExcepcion;
import futbolfacil.modelo.Cancha;
import futbolfacil.modelo.Local;
import futbolfacil.util.ConexionBD;

public class CanchaDAO extends BaseDAO {

	/* ----------------------------------------------------------------------
	 * Amed Ysmodes. 
	 * CanchaDAO. (no modificar nada de este bloque)
	 */
	public void insertar(Cancha objCancha) throws DAOExcepcion {
		System.out.println("CanchaDAO: insertar(Cancha objCancha)");
		
		validarDatos(objCancha);		
		validarDuplicado(objCancha);
		
		String query = "INSERT INTO articulo(art_des, art_car, art_fot, art_pre, cat_cod, loc_cod) " +
						"VALUES (?,?,?,?,1,?)";
		Connection con = null;
		PreparedStatement stmt = null;
		
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);		
			stmt.setString(1, objCancha.getDescripcionCancha());
			stmt.setString(2, objCancha.getCaracteristicasCancha());
			stmt.setString(3, objCancha.getFotoCancha());
			stmt.setDouble(4, objCancha.getPrecioCancha());
			stmt.setInt(5, objCancha.getLocalCancha().getCodigoLocal());
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo insertar");
			}
			System.out.println("Cancha Registrada. \n");
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}
	
	public Cancha buscarPorCodigo(int codigo) throws DAOExcepcion {
		System.out.println("CanchaDAO: buscarPorCodigo(int codigo)");
		
		String query = "SELECT * FROM articulo WHERE art_cod = ?";
		Cancha objCancha = new Cancha();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, codigo);
			rs = stmt.executeQuery();
			
			if(rs.next()){
				objCancha.setCodigoCancha(rs.getInt("art_cod"));
				objCancha.setDescripcionCancha(rs.getString("art_des"));
				objCancha.setPrecioCancha(rs.getDouble("art_pre"));
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		
		return objCancha;
	}
	
	public Collection<Cancha> Listar() throws DAOExcepcion {
		
		System.out.println("CanchaDAO: Listar()");
		Collection<Cancha> c = new ArrayList<Cancha>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			String query = "Select * From articulo where cat_cod = 1";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			while(rs.next()) {
				Cancha objCancha = new Cancha();				
				objCancha.setCodigoCancha(rs.getInt("art_cod"));
				objCancha.setDescripcionCancha(rs.getString("art_des"));
				c.add(objCancha);
			} 
		} catch (SQLException e) {
				System.err.println(e.getMessage());
				throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return c;
	}
	
	public Collection<Cancha> ListarCanchaPorLocal(int idLocal) throws DAOExcepcion {
		
		System.out.println("CanchaDAO: ListarCanchaPorLocal()");
		Collection<Cancha> c = new ArrayList<Cancha>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			String query = "Select * From articulo where cat_cod = 1 and loc_cod = ?";
			stmt = con.prepareStatement(query);
			stmt.setInt(1, idLocal);
			rs = stmt.executeQuery();
			while(rs.next()) {
				Cancha objCancha = new Cancha();				
				objCancha.setCodigoCancha(rs.getInt("art_cod"));
				objCancha.setDescripcionCancha(rs.getString("art_des"));
				c.add(objCancha);
			} 
		} catch (SQLException e) {
				System.err.println(e.getMessage());
				throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return c;
	}
	/* ----------------------------------------------------------------------
	 * Methodos extras.
	 */	
	private void validarDatos(Cancha objCancha) throws DAOExcepcion {
		System.out.println("CanchaDAO: validarDatos(Cancha objCancha)");
		
		String msg = "";

		if(objCancha.getDescripcionCancha().trim().equals(""))
			msg += "Descripcion de la Cancha no puede ser vacio. \n";
		if(objCancha.getCaracteristicasCancha().trim().equals(""))
			msg += "Caracteristicas de la Cancha no puede ser vacio. \n";
		if(objCancha.getFotoCancha().trim().equals(""))
			msg += "Foto de la Cancha no puede ser vacio. \n";
		if(("" + objCancha.getPrecioCancha()).trim().equals(""))
			msg += "Precio de la Cancha no puede ser vacio. \n";
		if(("" + objCancha.getLocalCancha().getCodigoLocal()).equals(""))
			msg += "Local de la Cancha no puede ser vacio. \n";	
		if(!msg.equals("")) {//Si exite algun error lanza excepcion
			System.out.println("Error: \n" + msg);
			throw new DAOExcepcion(msg);
		}	
	}
	
	private void validarDuplicado(Cancha objCancha) throws DAOExcepcion {
		System.out.println("CanchaDAO: validarDuplicado(Cancha objCancha)");
		
		String msg = "";
		
		if(existeDes(objCancha.getLocalCancha().getCodigoLocal(), objCancha.getDescripcionCancha()))
			msg += "Descripcion: " + objCancha.getDescripcionCancha() + " ya existe para el local " + objCancha.getLocalCancha().getDescripcionLocal() + ". \n";
		if(!msg.equals("")) {//Si exite algun error lanza excepcion
			System.out.println("Error: \n" + msg);
			throw new DAOExcepcion(msg);
		}
	}
	
	private boolean existeDes(int local, String descripcion) {
		System.out.println("CanchaDAO: existeDes(String campo, String valor)");
		
		String query = "SELECT * FROM articulo WHERE loc_cod = ? and art_des = ?";
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, local);
			stmt.setString(2, descripcion);
			rs = stmt.executeQuery();
			
			if (rs.next()){
				return true;
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		
		return false;
	}
	
	private boolean existe(String campo, String valor) {
		System.out.println("CanchaDAO: existe(String campo, String valor)");
		
		String query = "SELECT * FROM articulo WHERE "+ campo +" = ?";
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, valor);
			rs = stmt.executeQuery();
			
			if (rs.next()){
				return true;
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		
		return false;
	}
	/* ----------------------------------------------------------------------
	 */	
	
	/*
	 * Igmar Leon
	 */
	
	public Collection<Cancha> buscarporLocal(String distrito, String dia, String horIni, String horFin) throws DAOExcepcion {
		
		System.out.println("CanchaDAO: BuscarporLocal()");
		Collection<Cancha> cCancha = new ArrayList<Cancha>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			String query = "Select A.loc_cod, A.art_cod, A.art_des, A.art_car, A.art_fot, " +
						   "H.hor_ini, H.hor_fin, H.hor_pre, " +
						   "AD.alq_det_hor_ini, AD.alq_det_hor_fin, " +
						   "M.man_hor_ini, M.man_hor_fin " +
						   "From articulo A Join local L " +
						   "On A.loc_cod = L.loc_cod " +
						   "Join horario H " +
						   "On A.art_cod = H.art_cod " +
						   "Left Join alquiler_detalle AD " +
						   "On A.art_cod = AD.art_cod " +
						   "Left Join alquiler AL " +
						   "On AD.alq_nro = AL.alq_nro " +
						   "Left Join mantenimiento_detalle MD " +
						   "On A.art_cod = MD.art_cod " +
						   "Left Join mantenimiento M " +
						   "On MD.man_nro = M.man_nro " +
						   "Where L.loc_dis = ? And H.hor_dia = ? And " +
						   "(H.hor_ini >= ? And H.hor_fin <= ?) " +
						   "Or DayName(AL.alq_fec) = ? Or DayName(M.man_fec) = ?";
			stmt = con.prepareStatement(query);
			stmt.setString(1, distrito);
			stmt.setString(2, dia);
			stmt.setString(3, horIni);
			stmt.setString(4, horFin);
			stmt.setString(5, dia);
			stmt.setString(6, dia);
			rs = stmt.executeQuery();
			while(rs.next()) {
				Cancha oCancha = new Cancha();
				LocalDAO oLocal = new LocalDAO();
				oCancha.setLocalCancha(oLocal.buscarPorCodigo(rs.getInt("loc_cod")));
				oCancha.setCodigoCancha(rs.getInt("art_cod"));
				oCancha.setDescripcionCancha(rs.getString("art_des"));
				oCancha.setCaracteristicasCancha(rs.getString("art_car"));
				oCancha.setPrecioCancha(rs.getDouble("hor_pre"));
				oCancha.setFotoCancha(rs.getString("art_fot"));
				cCancha.add(oCancha);
			} 
		} catch (SQLException e) {
				System.err.println(e.getMessage());
				throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return cCancha;
	}

	
}
